package praktikum4Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import praktikum4GastKomponente.Datentyp.DGastEMail;
import praktikum4GastKomponente.Datentyp.DGastIstStammkunde;
import praktikum4GastKomponente.Datentyp.DGastName;
import praktikum4GastKomponente.Datentyp.DGastNr;
import praktikum4GastKomponente.Entitaeten.EGast;
import praktikum4GastKomponente.Komponente.GastKomponente;
import praktikum4Reservierungskomponente.Entitaeten.EReservierung;
import praktikum4Reservierungskomponente.Entitaeten.EZusatzleistungen;
import praktikum4Reservierungskomponente.Komponente.ReservierungsKomponente;

public class TestIntegrationGastReservierung {

	@Before
	public void test_reset() {
		praktikum4Reservierungskomponente.Verwalter.VReservierungsServices.res();
		praktikum4GastKomponente.Verwalter.VGastServices.res();
	}
	
	@After
	public void test_reset2() {
		praktikum4Reservierungskomponente.Verwalter.VReservierungsServices.res();
		praktikum4GastKomponente.Verwalter.VGastServices.res();
	}

	@Test
	public void test_reserviereZimmer() {
		GastKomponente gastKomponente = new GastKomponente();
		ReservierungsKomponente reservierungsKomponente = new ReservierungsKomponente(gastKomponente);
		gastKomponente.erzeugeGast(0, "Black Jack", "night@light.de");
		EReservierung res1 = reservierungsKomponente.reserviereZimmer(0, 1);
		assertEquals(((Integer)res1.getReservierungsNr().getNr()).toString(), getReservierung(res1.getReservierungsNr().getNr(),"RESERVIERUNG","DRESERVIERUNGSNR"));
		assertEquals(((Integer)res1.getGastNr().getNr()).toString(), getReservierung(res1.getReservierungsNr().getNr(), "RESERVIERUNG","DGASTNR"));
		assertEquals(((Integer)res1.getZimmerNr().getNr()).toString(), getReservierung(res1.getReservierungsNr().getNr(), "RESERVIERUNG","DZIMMERNR"));
	}
	
	@Test
	public void test_bucheZusatzleistungen(){
		GastKomponente gastKomponente = new GastKomponente();
		ReservierungsKomponente reservierungsKomponente = new ReservierungsKomponente(gastKomponente);
		gastKomponente.erzeugeGast(0, "Black Jack", "night@light.de");
		EReservierung reservierung = reservierungsKomponente.reserviereZimmer(0, 1);
		EZusatzleistungen leistung = reservierungsKomponente.erzeugeZusatzleistungen("Rueckenmassage");
		reservierungsKomponente.bucheZusatzleistungen(reservierung.getReservierungsNr().getNr(), leistung.getZusatzleistungNr().getNr());
		assertEquals(((Integer)reservierung.getReservierungsNr().getNr()).toString(), getReservierung(reservierung.getReservierungsNr().getNr(), "RESERVIERUNGZUSATZLEISTUNG", "DRESERVIERUNGSNR"));
		assertEquals(((Integer)leistung.getZusatzleistungNr().getNr()).toString(), getReservierung(reservierung.getReservierungsNr().getNr(), "RESERVIERUNGZUSATZLEISTUNG", "DZUSATZLEISTUNGNR"));
	}
	
	@Test
	public void test_stammgastWerden(){
		GastKomponente gastKomponente = new GastKomponente();
		ReservierungsKomponente reservierungsKomponente = new ReservierungsKomponente(gastKomponente);
		EGast eGast1 = gastKomponente.erzeugeGast(0, "Black Jack", "night@light.de");
		reservierungsKomponente.reserviereZimmer(0, 0);
		reservierungsKomponente.reserviereZimmer(0, 0);
		reservierungsKomponente.reserviereZimmer(0, 0);
		reservierungsKomponente.reserviereZimmer(0, 0);
		reservierungsKomponente.reserviereZimmer(0, 0);
		reservierungsKomponente.reserviereZimmer(0, 0);
		EGast eGast2 = getGast(eGast1.getNr().getNr());
		assertTrue(eGast2.getIstStammkunde().getIstStammkunde());
		
	}

	public static EGast getGast(int nr){
		
		String querry = "SELECT * FROM GAST WHERE DGASTNR = " + nr;
		System.out.println(querry);
		EGast eGast;
	
		Statement stmt = statement();
		
		try {
			ResultSet rs = stmt.executeQuery(querry);
			rs.next();
			eGast = new EGast(new DGastNr(rs.getInt("DGASTNR")), new DGastName(rs.getString("DGASTNAME")), 
					new DGastEMail(rs.getString("DGASTEMAIL")), new DGastIstStammkunde(rs.getString("DGASTISTSTAMMGAST")));
			stmt.close();
			return eGast;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError("Conection Faild");
		}

	}
	
	public static String getReservierung(int nr, String table, String atr){
		
		String querry = "SELECT " + atr + " FROM " + table + " WHERE DRESERVIERUNGSNR = " + nr;
		System.out.println(querry);
		String res;
	
		Statement stmt = statement();
		
		try {
			ResultSet rs = stmt.executeQuery(querry);
			rs.next();
			res = (rs.getString(atr));
			stmt.close();
			return res;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError("Conection Faild");
		}

	}
	
	public static Statement statement() {

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@oracle.informatik.haw-hamburg.de:1521:inf09";
			Connection con = DriverManager.getConnection(url,
					praktikum4GastKomponente.Connection.ConnectionDATA.ACC,
					praktikum4GastKomponente.Connection.ConnectionDATA.PASS);
			return con.createStatement();
		} catch (SQLException e) {
			throw new ExceptionInInitializerError("Conection Faild");
		} catch (ClassNotFoundException e) {
			throw new ExceptionInInitializerError("Conection Faild");
		}
	}

}
